
import util from 'util' //node内置模块
import inquirer from 'inquirer';
import downloadGitRepo from 'download-git-repo' // 不支持 Promise
import chalk from 'chalk';

import { getRepoList } from './http.js'
import { wrapLoading } from '../utils/utils.js'


export default class Generator {
    constructor(name) {
        // 目录名称
        this.name = name;
        // 对 download-git-repo 进行 promise 化改造
        this.downloadGitRepo = util.promisify(downloadGitRepo);
    }

    // 核心创建逻辑
    // 1）获取模板名称
    // 2）获取 tag 名称
    // 3）下载模板到模板目录
    async getRepo() {
        // 1）从远程拉取模板数据
        const repoList = await wrapLoading(getRepoList, {
            success: 'Successfully obtained template...',
            fail: 'Failed to obtain template...'
        });
        if (!repoList) return;
        // 过滤我们需要的模板名称
        const repos = repoList.map(item => item.name);
        // 2）用户选择自己新下载的模板名称
        const { repo } = await inquirer.prompt({
            name: 'repo', // key 名
            type: 'list', //type： input, number, confirm, list, checkbox ... 
            choices: repos,
            message: 'Please choose a template to create project'
        })
        // 3）return 用户选择的名称
        return repo;
    }


    // https://gitee.com/wangjiawei2777/vue3_template.git
    // 下载远程模板
    // 1）拼接下载地址
    // 2）调用下载方法
    async download(repo) {
        // 1）拼接下载地址
        const requestUrl = `direct:https://gitee.com/wangjiawei2777/${repo}.git`;
        // 2）调用下载方法
        await wrapLoading(
            this.downloadGitRepo, // 远程下载方法
            {
                // start: '等待下载模版...',
                success: 'Template download successful...',
                fail: 'Failed to download template...'
            }, // 加载提示信息
            requestUrl, // 参数1: 下载地址
            this.name,  //参数2: 要创建的项目名
            { clone: true },//参数3: 执行git clone
        )
    }

    async create() {
        // 1）获取模板名称
        const repo = await this.getRepo()
        console.log('repo :>> ', repo);
        // // 2）下载模板到模板目录
        await this.download(repo)
        // 3）模板使用提示
        console.log(`\r\nSuccessfully created project ${chalk.cyan(this.name)}`)
        console.log(`\r\n  cd ${chalk.cyan(this.name)}`)
        console.log('  npm run dev\r\n')
    }
}